package com.macaline.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 执行命令行的工具类
 * @author warm_joy
 */
public class ShellUtil {
	
	/**
	 * 执行命令行
	 * @author warm_joy
	 * @param command 需要执行的命令行，多条命令行用 && 隔开 
	 * 	例：cd /Users/a/GitHub/wangmarket/target/classes/&&java com.TomcatApplication
	 */
	public static List<String> exeCommand(String command) {
		Process process = null; 
		List<String> processList = new ArrayList<String>(); 
		try {  
			process = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", command});  
			BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));  
			String line = "";  
			while ((line = input.readLine()) != null) {
				processList.add(line); 
			}  
			input.close();
		} catch (IOException e) {
			e.printStackTrace();  
		}
		return processList;
	}
	
	/**
	 * 得到当前磁盘的未使用的空间大小
	 * @author warm_joy
	 * @return 当前剩余的空间单位。单位：G
	 */
	public static int getUnUsedSize(String environment) {
		// 执行查看磁盘空间命令
		List<String> resultList = exeCommand("df -hl");
		// 货物查询结果
		String result = resultList.get(1);
		int indexOf = result.indexOf(" ");
		result = result.substring(indexOf).replaceAll(" ", "");
		result = "112Gi40Gi72Gi34%75373842942135410%/";
		
		// 根据查询结果得到不同得到结果
		Map<String, Object> map = getDiskCapacityInteger(result, environment);
		// 获取硬盘的总内存
		int totalSize = (int) map.get("result");
		result = (String) map.get("string");
		
		// 获取硬盘的已经使用的内存
		map = getDiskCapacityInteger(result, environment);
		int usedSize = (int) map.get("result");
		result = (String) map.get("string");
		
		// 获取硬盘的未使用的内存
		map = getDiskCapacityInteger(result, environment);
		int unUsedSize = (int) map.get("result");
		
		// 检查结果是否正确
		if((usedSize + unUsedSize) >= totalSize + 3 || (usedSize + unUsedSize) <= totalSize - 3) {
			return 0;
		}
		return unUsedSize;
	}
	
	/**
	 * 获取当前字符串中最前方的以G为单位的数值，不足1G则判断为1G
	 * @author warm_joy
	 * @param string 需要判断的字符串，如："50M2.6K48G6%/"
	 * @return 
	 * 	<ul>
	 * 		<li>result:获得的整数</li>
	 * 		<li>string:出去此次结果后的字符串，如："50M2.6K48G6%/"，则返回 "2.6K48G6%/"</li>
	 * 	</ul>
	 */
	private static Map<String, Object> getDiskCapacityInteger(String string, String environment) {
		Map<String, Object> map = new HashMap<String, Object>(2);
		String G = "G";
		int gSize = 1;
		if(environment.indexOf("Mac") != -1) {
			G = "Gi";
			gSize = 2;
		}
		// 查询字符串中的
		int indexOfG = string.indexOf(G);
		int indexOfM = string.indexOf("M");
		int indexOfK = string.indexOf("K");
		// 如果有K存在的话确认K是否在第一位
		if(indexOfK != -1) {
			// 当前字符串第一位数的单位可能是K的情况
			if(indexOfG > indexOfK) {
				// 如果存在M那么第一位也有可能是M
				if(indexOfM != -1) {
					// 如果第一位是M的情况
					if(indexOfM < indexOfK) {
						map.put("result", 0);
						map.put("string", string.substring(indexOfM + gSize));
						return map;
					}
				}
				// 如果第一位是K的情况
				map.put("result", 0);
				map.put("string", string.substring(indexOfK + gSize));
				return map;
			}
		}
		// 如果有K存在的话确认M是否在第一位
		if(indexOfM != -1) {
			// 当前字符串第一位数的单位可能是M的情况
			if(indexOfG > indexOfM) {
				if(indexOfK != -1) {
					// 如果第一位是K的情况
					if(indexOfK < indexOfM) {
						map.put("result", 0);
						map.put("string", string.substring(indexOfK + gSize));
						return map;
					}
				}
				// 如果第一位是M的情况
				map.put("result", 1);
				map.put("string", string.substring(indexOfM + gSize));
				return map;
			}
		}
		// 如果当时第一位是G的情况
		String number = string.substring(0, indexOfG);
		// 判断是否有小数
		int indexOfSpot = number.indexOf(".");
		Integer usedSize = null;
		// 如果有小数则只取前面的整数部分
		if(indexOfSpot != -1) {
			usedSize = Integer.parseInt(number.substring(0, indexOfSpot));
		}
		if(indexOfSpot == -1) {
			usedSize = Integer.parseInt(number);
		}
		// 得到当前的容量
		map.put("result", usedSize.intValue());
		map.put("string", string.substring(indexOfG + gSize));
		return map;
	}
}
